package LLDemo;

import org.w3c.dom.Node;

public class MyLinkedList {
    private Node head =new Node();
    private int size = 0;
    public class Node{
        private Object data;
        private Node next;
    }
//    1.向集合(this)中末尾添加元素
    public void add(Object obj) {
        //从头节点出发，找到链表末尾
        Node node = head;
        //找到链表尾部的前一个节点
        while (node.next != null) {
            node = node.next;
        }
        //创建新的节点
        Node newNode = new Node();
        //存储节点数据
        newNode.data = obj;
        //讲新建的节点存放到末端
        node.next = newNode;
        //节点+1
        size++;
    }
//    2.向集合index的位置中插入obj元素
    public void add(int index,Object obj){
        Node node = head;
        for (int i = 0; i < index; i++) {
            node = node.next;
        }
        //新增一个节点
        Node newNode = new Node();
        //新节点添加数据
        newNode.data = obj;
        //让新增的节点等于原节点
        newNode.next = node.next;
        //讲新建的节点的引用指向新的节点
        node.next = newNode;
        //链表节点个数+1
        size++;
    }
//    3.从集合中获得指定位置(index)的元素
    public Object get(int index){
        Node node = head;
        for (int i = 0; i < index; i++) {
            node = node.next;
        }
        return node.data;
    }
//    4.替换指定位置上的元素，替换成obj，并且返回被替换的元素
    public Object set(int index,Object obj){
        Node node = head;
        for (int i = 0; i < index; i++) {
            node = node.next;
        }
        Node newNode = node;
        node.data = obj;
        return newNode.data;
    }
//    5.删除指定位置(index)上的元素，并且返回删除的元素
    public Object delete(int index){
        Node node = head;
        for (int i = 0; i < index; i++) {
            node = node.next;
        }
        Node deleteNode = node.next;
        node.next = node.next.next;
        size--;
        return deleteNode.data;
    }
//    6.删除第一个指定元素(obj)
    public void delete(Object obj){
        Node node = head;
        while (node.next != null) {
            node = node.next;
            if (obj.equals(node.next.data)) {
             node.next = node.next.next;
             size--;
             break;
            }
        }
    }
//    7.获得集合中的元素个数
    public int sum(){
        return size;
    }
//    8.判断集合中是否存在指定元素obj
    public boolean judge(Object obj){
        return false;
    }
//    9.判断集合是否为空：没有有效元素是空
    public boolean isEmpty(){
        if (size == 0){
            return true;
        }
        return false;
    }
//    10.打印出在集合中的有效元素
public String toString(){
    StringBuilder sb = new StringBuilder("[");
    Node node = head;
    while(node.next != null){
        node = node.next;
        sb.append(node.data + ",");
    }
    sb.deleteCharAt(sb.length()-1);
    sb.append("]");
    return sb.toString();
}
//找到index位置之前的一个节点
    private Node preNode(int index){
        return null;
    }
}
